iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
1

大家會不會好奇那麼多程式碼,背後到底是誰推進的呢?
那會是怎麼樣的機制呢?

答案是線程(Thread), 在程式碼背後 他就像一個馬達驅動程式碼的執行

組成

  • Looper

  • Handler

  • MessageQueue

  • Message

運作機制

  • Looper : 可以看成一個抽水馬達,透過調用 Loop.looper(), 形成一個循環,不斷地從MessageQueue中提取Message

  • Message : 要執行的程式碼, 可以看成是水, Message會關聯 送出他的 Handler , 當 輪到這個 Message , Looper會把它取出 , 送出它的 Handler 會把它處理掉

  • Handler : 負責向 MessageQueue 添加 Message , 和處理自己送出的 Message。

  • MessageQueue : 所有的 Message 在此駐隊排列 , Looper.loop()調用 MessageQueue.next() 方法取Message

異步更新 UI

在 非主線程 執行異步程式碼 , 當執行完成獲取執行結果後 , 想要更新 UI 畫面 , 這時候可以透過調用主線程 的 Handler 在 非主線程 中 發送 Message 到 主線程的 MessageQueue , 等到輪到這個 Message 時, Looper 將這個 Message取出 , 這個發送的 Handler 會處理這個Message , 去執行更新畫面

在Activity中新建一个handler , 當 handler 處理 發送的 Message , 會調用 Callback , 我們 可以在這個 callback 中獲取 在非主線程送出的訊息內容 , 並更新 UI 畫面

  


   val handler  = Handler(object:Handler.Callback{

       override fun handleMessage(msg: Message): Boolean {

           textView.text = "${msg.what}"

           return true;
       }


   })



主線程 handler 在非主線程中 向主線程 MessageQueue 發送 Message


   


  val thread = Thread (object :Runnable  {

      override fun run() {
          try {
              Thread.sleep(1000) //在非主線程 模擬一段耗時操作,比如請求網絡
              handler.sendEmptyMessage(0)
          } catch (e: InterruptedException) {
              e.printStackTrace()
          }
      }


  })

明天我們 會利用 Runnable (也是會包成 Message 發送到 MessageQueue ) 跟 Handler, 做出一個計時器

今天的源碼 https://github.com/liyiwin/Day3_Thread/tree/master/app


上一篇
[Day 2 下] Kotlin Function
下一篇
[Day 4] Handler + Runnable Timer 實作
系列文
Android 菜鳥村-開發基礎 30篇32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言